# _*_ coding:utf-8 _*_
# 开发团队: Mavericks
# 开发人员：Maverick·Ming
# 开发IDE： PyCharm
#   项目名：HelloWorld
#   文件名：6.05 封装.py
# 开发时间：2021/3/26 0:06

class Mavericks:
    """This is a coder of the Team-Mavericks"""
    def __init__(self, name):
        self.hidden_name = name

    def get_name(self):
        return self.hidden_name

    def set_name(self, name):
        self.hidden_name = name

    # 公有方法
    def say_hello(self, say):
        print(self.hidden_name, "向您say %s " % say)


# 封装，面向对象的三大特性之一
# 指隐藏对象中，一些不希望被外部访问或者随意修改的属性或方法
# 如何隐藏属性？方式一：改一个外部不知道的属性名（name -> hidden_name）
mm = Mavericks('MaverickMing')
# print(mm.name)  # 隐藏了name成hidden_name之后，就无法访问name了
# 隐藏了属性之后，如何访问(修改)对象中的属性？
#   - 需要为每一个属性提供一个setter和getter
#   - 使得外部可以访问到该属性
#   - getter 获取对象中的指定属性(get_属性名)
print(mm.get_name())
#   - setter 修改对象中指定属性的值(set_属性名)
mm.set_name('Maverick·Ming')
print(mm.get_name())

# 根据以上发现：
#   使用了封装，增加了类的定义的复杂性，确保了类的数据的安全性
#   1.隐藏了属性名，使得调用者无法随意修改属性
#   2.增加了getter、setter方法，很好地控制了属性的只读权限（如注释掉setter即为只读）
#   3.setter方法，可以增加数据验证，确保数据的准确性
#   4.使用getter、setter方法时，除了读取修改属性，可以同时做额外的工作（在setter、getter方法中添加即可）

